import GraceRequestConfig from '@/custom/graceRequestConfig.js';

// 用于存储单例实例的变量
let webSocketClientInstance;

// 创建WebSocket客户端类
class WebSocketClient {
	// 存储WebSocket实例，初始化为null
	socket = null;
	// WebSocket连接的地址
	url;
	// 心跳间隔时间，单位毫秒，默认5000毫秒（5秒）
	heartbeatInterval;
	// 重连超时时间，单位毫秒，默认5000毫秒（5秒）
	reconnectTimeout;
	// 心跳定时器
	heartbeatTimer = null;
	// 重连定时器
	reconnectTimer = null;
	// 标记是否已连接，初始化为false
	isConnected = false;
	// 标记是否正在重连，初始化为true，表示默认开启重连机制
	isReconnecting = true;


	// 构造函数，用于初始化WebSocket客户端实例
	constructor(url, heartbeatInterval = 5000, reconnectTimeout = 5000) {
		this.url = url;
		this.heartbeatInterval = heartbeatInterval;
		this.reconnectTimeout = reconnectTimeout;
		this.connect();
	}

	// 建立WebSocket连接的私有方法
	connect() {
		// 使用uni.connectSocket建立WebSocket连接（这里假设uni是相关环境下可用的对象，如果不存在需要替换为对应平台的WebSocket建立方式）
		this.socket = uni.connectSocket({
			url: this.url,
			success: () => {
				// 连接成功，标记为已连接
				this.isConnected = true;
				// 启动心跳机制
				this.startHeartbeat();
				console.log('WebSocket已连接');
				//获取未读总数
			},
			fail: () => {
				console.log('WebSocket连接失败，正在重试...');
				// 连接失败，安排重连
				this.scheduleReconnect();
			}
		});

		// 监听接收消息事件，将原有的内部处理逻辑提取出来，方便外部传入自定义的处理函数
		// 接收消息
		this.socket.onMessage((res) => {
			if(res.data == 'pong'){
				return
			}
			console.log('Received message:', res.data)
			if(res.data == 'pong') return
			this.onSocketMessageCallback(JSON.parse(res.data))
	    })

		// 监听连接关闭事件
		this.socket.onClose(() => {
			console.log('WebSocket已关闭');
			// 标记为未连接
			this.isConnected = false;
			// 停止心跳
			this.stopHeartbeat();
			// 如果开启着重连机制，则安排重连
			if (this.isReconnecting) this.scheduleReconnect();
		});

		// 监听连接出错事件
		this.socket.onError(() => {
			console.log('WebSocket出现错误');
			// 标记为未连接
			this.isConnected = false;
			// 停止心跳
			this.stopHeartbeat();
			// 安排重连
			this.scheduleReconnect();
		});
	}

	onSocketMessageCallback(callback) {

	}

	// 启动心跳的私有方法，定时发送心跳消息（这里发送的是'ping'，具体可根据服务端约定调整）
	startHeartbeat() {
		this.heartbeatTimer = setInterval(() => {
			if (this.isConnected) {
				this.sendMessage('ping');
				console.log('心跳已发送');
			}
		}, this.heartbeatInterval);
	}

	// 停止心跳的私有方法，清除心跳定时器
	stopHeartbeat() {
		if (this.heartbeatTimer) {
			clearInterval(this.heartbeatTimer);
			this.heartbeatTimer = null;
		}
	}

	// 安排重连的私有方法，设置重连定时器，超时后尝试重新连接
	scheduleReconnect() {
		if (this.reconnectTimer) return;
		this.reconnectTimer = setTimeout(() => {
			console.log('正在重连...');
			this.connect();
			this.reconnectTimer = null;
		}, this.reconnectTimeout);
	}

	// 向服务端发送消息的公有方法，前提是已连接且WebSocket实例存在
	sendMessage(data) {
		if (this.isConnected && this.socket) {
			this.socket.send({ data });
			console.log('消息已发送:', data);
		}
	}

	// 手动关闭WebSocket连接的公有方法
	close() {
		if (this.socket) {
			// 关闭重连机制
			this.isReconnecting = false;
			this.socket.close();
			this.socket = null;
			this.stopHeartbeat();
			webSocketClientInstance = null
			console.log('WebSocket已手动关闭');
		}
	}
}

// 获取WebSocketClient单例实例的函数
function getWebSocketClient() {
	if(!uni.app.checkLogin){
		return
	}

	if (!webSocketClientInstance) {
		var token = uni.getStorageSync('token');
		if(!uni.app.isEmpty(token)){
			// 获取用户信息（这里假设和原代码一样使用uni.getStorageSync获取用户信息）
			var user = uni.getStorageSync('user');
			console.log('user======'+JSON.stringify(user))
			const url = GraceRequestConfig.wsUrl + '?authorName=' + user.authorName + "&authorId=" + user.authorId;
			// 创建实例并赋值给存储变量
			webSocketClientInstance = new WebSocketClient(url);
		}
	}
	return webSocketClientInstance;
}

// 将获取单例实例的函数作为默认导出，外部通过调用这个函数获取唯一的WebSocketClient实例
export default getWebSocketClient;
